fseek関数は、ファイルの入力・出力位置(ファイルオフセット)を制御することができます。
同じような機能のfsetpos関数との相違は、fseek関数はファイルオフセットをlong int型で指定するため、ファイルの大きさは約2GBまで(long int型が4バイト長の場合)となります。これに対して、fsetpos関数はファイルオフセットを専用の構造体で管理することにより、2GB以上のファイルも取り扱えるようになっています。
#include <stdio.h>
int fseek(FILE *stream, long offset, int whence);
*streamはfopen関数で取得した、ファイルポインタを指定します。
offsetはファイルオフセットの移動量をバイト単位で指定します。指定する値の意味は第3引数のwhenceにより変わります
whenceは第2引数のoffsetの起点をSEEK_SET(ファイルの先頭)、SEEK_CUR(現在のファイルオフセット)、SEEK_END(ファイルの末尾)の何れかで指定します。
戻り値として、正常に処理ができた場合は0を、失敗した場合は-1を返します。
次の例題プログラムは、入力したデータの英小文字を英大文字に変換した後、同じ場所にデータを出力することにより、ファイル内の英字を大文字にしています。ファイルの更新を行うため、fopen関数のオープンモードは’r+’になっています。
プログラム 例
#include <stdio.h> #include <string.h> #include <ctype.h> #define SIZE 1024 int main(int argc, char **argv) { FILE *fp; long offset; char buff[SIZE]; char *p_buff; int return_code = 0; if (argc == 2) { if ((fp = fopen(*(argv + 1), 'r+')) != NULL) { while(fgets(buff, SIZE, fp) != NULL) { /* 英小文字を英大文字に変換 */ for (p_buff = buff; *p_buff; ++p_buff) { *p_buff = toupper(*p_buff); } /* 入力したデータの先頭にファイルオフセットを戻す為の長さを求める */ offset = 0L - strlen(buff); /* 入力したデータの先頭にファイルオフセットを戻す */ fseek(fp, offset, SEEK_CUR); fputs(buff, fp); } fclose(fp); } else { printf('ファイルのオープンに失敗しました\n'); return_code = 1; } } else { printf('実行時引数の数が不当です\n'); return_code = 1; } return return_code; }
例の実行結果
$ cat temp_1.txt #include <stdio.h> int main() { printf('Hello World!!.\n'); return 0; } $ $ ./fseek.exe temp_1.txt $ $ cat temp_1.txt #INCLUDE <STDIO.H> INT MAIN() { PRINTF('HELLO WORLD!!.\N'); RETURN 0; } $